#include<bits/stdc++.h>
#define MAXN 100005

using namespace std;

long long w[4 * MAXN];
int v[MAXN];

void pushup(int u)
{
	w[u] = w[u * 2] + w[u * 2 + 1];
}

void build(int u , int L , int R)
{
	if(L == R)
	{
		w[u] = v[L];
		return;
	}
	else
	{
		int M = (L + R) / 2;
		build(u * 2 , L , M);
		build(u * 2 + 1 , M + 1 , R);
		pushup(u);
	}
}

int query_p(int u , int L , int R , int x)
{
	if(L == R)
	{
		return w[u];
	}
	else
	{
		int M = (L + R) / 2;
		if(M <= x)
		{
			return query_p(u * 2 , L , M , x);
		}
		else
		{
			return query_p(u * 2 + 1 , M + 1 , R , x);
		}
	}
}

void update_p(int u , int L , int R , int x , int n)
{
	if(L == R)
	{
		w[u] = x;
		return;
	}
	else 
	{
		int M = (L + R) / 2;
		if(M <= n)
		{
			update_p(u * 2 , L , M , x , n);
		}
		else
		{
			update_p(u * 2 + 1 , M + 1 , R , x , n);
		}
		pushup(u);
	}
}

bool inrange(int L , int R , int l , int r)
{
	return (L >= l) && (R <= r);
}

bool outrange(int L , int R , int l , int r)
{
	return (R < l) || (L > r);
}

long long query_r(int u , int L , int R , int l , int r)
{
	if(inrange(L , R , l , r))
	{
		return w[u];
	}
	else if(!outrange(L , R , l ,r))
	{
		int M = (L + R) / 2;
		return query_r(u * 2 , L , M , l , r) + query_r(u * 2 + 1 , M + 1 , R , l , r);
	}
	else
	{
		return 0;
	}
}

int n;

void prnt_t(int u)
{
	if(u >= 4 * n)
	{
		return;
	}
	cerr<<w[u]<<" "<<u<<"\n";
	prnt_t(u * 2) ; prnt_t(u * 2 + 1);
}

int r[MAXN] , t[MAXN];
vector<long long> vec;

int main()
{
	freopen("duel.in" , "r" , stdin);
	freopen("duel.out" , "w" , stdout);
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n;
	for(int i = 1 ; i <= n ; i++)
	{
		cin>>r[i];
	}
	for(int i = 1 ; i <= n ; i++)
	{
		t[r[i]]++;
	}
	vec.push_back(0);
	for(int i = 1 ; i <= n ; i++)
	{
		if(t[i] == 0)
		{
			continue;
		}
		else
		{
			vec.push_back(t[i]);
		}
	}
	vec.push_back(0);
	for(int i = 1 ; i <= vec.size() ; i++)
	{
		v[i] = vec[i];
	}
	build(1 , 1 , vec.size() - 2);
	long long dt = 0 , ans = query_r(1 , 1 , vec.size() - 2 , 1 , vec.size() - 2) , rmed = 0;

	for(int i = 1 ; i <= vec.size() ; i++)
	{
		cerr<<ans<<" ";
		if(query_r(1 , 1 , vec.size() - 2 , 1 , i) - rmed 
			<= query_p(1 , 1 , vec.size() - 2 , i + 1))
		{
			cerr<<query_r(1 , 1 , vec.size() - 2 , 1 , i) - rmed<<" "<<query_p(1 , 1 , vec.size() - 2 , i + 1)<<"\n";
			//cerr<<"query_r(1 , 1 , vec.size() - 2 , 1 , i) - rmed : "
			//<<query_r(1 , 1 , vec.size() - 2 , 1 , i) - rmed
			//<<" ans "<<ans<<"rmed : "<<rmed<<"\n";
			rmed = query_r(1 , 1 , vec.size() - 2 , 1 , i); 
			ans = query_r(1 , 1 , vec.size() - 2 , i , vec.size() - 2);
			update_p(1 , 1 , vec.size() - 2 , 0 , i + 1);
			//update_p(1 , 1 , vec.size() - 2 , 0 , i);
			cerr<<" ans "<<ans<<" rmed : "<<rmed<<" sit 1 \n";
		}
		else if(query_r(1 , 1 , vec.size() - 2 , 1 , vec.size() - 2) - rmed 
			<= ans)
		{
			ans = ans - query_r(1 , 1 , vec.size() - 2 , 1 , vec.size() - 2) + rmed;
			cerr<<" ans "<<ans<<" rmed : "<<rmed<<"sit 2 \n";
			break;
		}
		else
		{
			int tmp1 , tmp2;
			for(int j = i ; j <= vec.size() - 2 ; j++)
			{
				if(query_r(1 , 1 , vec.size() - 2 , i , j) >= vec.size())
				{
					int counter = 0;
					for(int k = i ; k <= j - 1 ; k++)
					{
						counter += query_p(1 , 1 , vec.size() - 2 , k);
						update_p(1 , 1 , vec.size() - 2 , 0 , k);
					}
					tmp2 = counter;
					update_p(1 , 1 , vec.size() - 2 , query_r(1 , 1 , vec.size() - 2 , i , j)
					 - counter , j); //sum[tmp1]
				}
				tmp1 = j;
			}
			ans -= query_r(1 , 1 , vec.size() - 2 , i , tmp1) - tmp2;
			rmed += query_r(1 , 1 , vec.size() - 2 , i , tmp1) - tmp2;
			cerr<<" ans "<<ans<<" rmed : "<<rmed<<"sit\n";
		}
	}
	cout<<ans;
	cerr<<rmed;
	return 0;
}